package com.study.modules.designPatterns.No2PolicyMode;

import java.math.BigDecimal;

/**
 * 策略模式
 * 策略模式：定义一系列的算法，把它们一个个封装起来，并且使它们可以相互替换。本模式使得算法可独立于使用它的客户而变化。
 * 策略模式的关键是将算法的不同实现封装起来，并使它们可以相互替换。
 * 策略模式的主要优点是算法可以自由切换，使用不同的算法只需要改变使用算法的上下文。
 * 策略模式的主要缺点是策略类会增多，使用本模式时需要考虑所有的策略，这会增加系统的复杂性。
 * <p>
 * 策略模式与状态模式的区别：
 * 策略模式属于行为型模式，它提供了一种算法的选择机制，允许在运行时选择一种算法。
 * 状态模式属于行为型模式，它提供了一种状态的切换机制，允许在运行时改变一个对象的行为。
 */
public class TestPolicyMode {

    /*
     * 演示如何使用Java实现策略模式。
     * 策略模式允许我们在运行时动态地选择算法或策略。
     * 在这个例子中，我们定义了一个策略接口Strategy，
     * 并实现了四个具体的策略类AddStrategy、SubtractStrategy、MultiplyStrategy和DivideStrategy。
     * 然后，我们定义了一个上下文类Calculator，它持有一个策略对象，并定义了一个calculate方法来使用策略对象执行计算。
     * 最后，在Main类中，我们创建了一个Calculator对象，并通过调用setStrategy方法设置不同的策略，然后调用calculate方法进行计算。
     */

    public static void main(String[] args) {
        System.out.println("===========策略模式测试===========");
        Calculator calculator = new Calculator();
        BigDecimal num1 = new BigDecimal("1");
        BigDecimal num2 = new BigDecimal("100");
        // 加法
        calculator.setStrategy(new AddStrategy());
        System.out.println("加法：" + calculator.calculator(num1, num2));
        // 减法
        calculator.setStrategy(new SubtractStrategy());
        System.out.println("减法：" + calculator.calculator(num1, num2));
        // 乘法
        calculator.setStrategy(new MultiplyStrategy());
        System.out.println("乘法：" + calculator.calculator(num1, num2));
        // 除法
        calculator.setStrategy(new DivideStrategy());
        System.out.println("除法：" + calculator.calculator(num1, num2));
    }

}
